package com.paas.form.visualdev.util;

import com.gencode.exception.GenCodeException;
import com.gencode.model.ColumnContext;
import com.gencode.model.TableContext;
import com.gencode.util.SqlTypeUtil;
import com.paas.common.jdbc.model.DbColumn;
import com.paas.common.jdbc.model.DbTableVo;
import com.paas.common.model.BaseModel;
import com.paas.common.util.NameUtil;

import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class VisualCodeCreate {


    /**
     * 描述:获取编码的根目录
     *
     * @return
     */
    public static String getCodeRootDir() {
        return System.getProperty("java.io.tmpdir") + File.separator + System.currentTimeMillis();
    }


    /**
     * 描述:解析表放入到context中
     * @param dbTableVo
     * @return
     */
    public static TableContext parse(DbTableVo dbTableVo){
        //表名称 有可能带有实体对象 uc_user
        String tableName = dbTableVo.getTableName();
        //表驼峰名称 ucUser
        String tableHumpName= getTableHump(tableName);
        //表驼峰名称首字母大写 UcUser
        String tableHumpUpper= NameUtil.upperInitial(tableHumpName);
        //表备注信息 用户表
        String tableRemark = dbTableVo.getRemarks();
        TableContext tableContext = new TableContext(tableName,tableHumpName,tableHumpUpper,tableRemark);
        List<String> superFields = getClassColumns(BaseModel.class);
        if(dbTableVo.getColumns()!=null && dbTableVo.getColumns().size()>0){
            List<ColumnContext> columns = null;
            List<ColumnContext> superClassColumns = null;
            ColumnContext columnContext = null;
            for(DbColumn column:dbTableVo.getColumns()){
                //字段名称 有可能带有实体对象 create_id
                String columnName = column.getColumnName();
                //字段名称驼峰 createId
                String columnHumpName = getTableHump(columnName);
                //字段类名称 CreateId
                String columnHumpUpper= NameUtil.upperInitial(columnHumpName);
                //字段备注 创建人
                String columnRemark = column.getRemarks();
                //字段是否主键
                boolean isPk = column.isPk();
                //字段的数据库类型 java.sql.Types
                String columnDataType = column.getDataTypeName();
                //字段java类型
                String columnJavaType = SqlTypeUtil.convertToJavaType(columnDataType);
                columnContext = new ColumnContext(columnName,columnHumpName,columnHumpUpper,columnRemark,isPk,columnDataType,columnJavaType);
                if(superFields.contains(columnHumpName)){//父实体类包含该字段
                    if(superClassColumns==null){
                        superClassColumns=new ArrayList<ColumnContext>();
                        superClassColumns.add(columnContext);
                    }else {
                        superClassColumns.add(columnContext);
                    }
                }else{
                    if(columns==null){
                        columns = new ArrayList<ColumnContext>();
                    }
                    columns.add(columnContext);
                }
            }
            tableContext.setColumns(columns);
            tableContext.setSuperColumns(superClassColumns);
        }
        return tableContext;
    }





    /**
     * 描述:获取类的字段信息
     * @param clazz
     * @return
     */
    protected static List<String> getClassColumns(Class<?> clazz) {
        List<String> columns = null;
        try {
            Field[] fields = clazz.getDeclaredFields();
            for(Field field:fields){
                if(columns==null){
                    columns = new ArrayList<String>();
                }
                columns.add(field.getName());
            }
        }catch (Exception e){
            throw new GenCodeException("获取BeanClass对象的属性字段出错");
        }
        return columns;
    }

    /**
     * 描述:出去 . 获取表名驼峰字符串
     * @param tableName
     * @return
     */
    protected static String getTableHump(String tableName){
        String entityName = NameUtil.toHump(tableName);
        entityName = NameUtil.dotFilter(entityName);
        entityName = NameUtil.lowerInitial(entityName);
        return entityName;
    }




}
